我想模拟数据包延迟和丢失的UDP
,并TCP
在Linux上衡量一个应用程序的性能.有一个简单的方法吗?
我们正在尝试各种方法来限制用户在给定时间段内的操作:
目前,我们正在使用Cache来简单地插入用户活动的记录 - 如果用户执行相同活动时存在该记录,我们就会加油.
使用缓存自动为我们提供过时的数据清理和用户的滑动活动窗口,但它如何扩展可能是一个问题.
还有哪些其他方法可以确保可以有效地限制请求/用户操作(强调稳定性)?
我需要一个组件/类来限制某些方法的执行到N秒内的最大M次调用(或ms或nanos,无关紧要).
换句话说,我需要确保我的方法在N秒的滑动窗口中执行不超过M次.
如果您不知道现有的课程,请随时发布您的解决方案/想法如何实现这一点.
我刚刚阅读这篇文章关于防止快速登录尝试的基于表单的网站身份验证的权威指南.
最佳实践#1:短暂的时间延迟随着尝试失败的次数而增加,例如:
1次尝试失败=无延迟
2次尝试失败= 2秒延迟
3次尝试失败= 4秒延迟
4次尝试失败= 8秒延迟
5次尝试失败= 16秒延迟
等
DoS攻击这个方案将是非常不切实际的,但另一方面,可能具有破坏性,因为延迟会呈指数级增长.
我很好奇我如何在PHP中为我的登录系统实现这样的东西?
我使用mikeal/request来进行API调用.我最频繁使用的API之一(Shopify API).最近推出了一个新的通话限制,我看到的错误如下:
Exceeded 6.0 calls per second for api client. Slow your requests or contact support for higher limits.
Run Code Online (Sandbox Code Playgroud)
我已经进行了升级,但无论我获得多少带宽,我都必须考虑到这一点.对Shopify API的大多数请求都在async.map()函数中,这些函数循环异步请求并收集正文.
我正在寻找任何帮助,也许是一个已经存在的库,它将包裹请求模块并实际阻塞,休眠,限制,分配,管理,同步发出的许多同时请求并限制它们6
在一时间 如果不存在这个项目,我没有问题.我只是不知道如何处理这种情况,我希望有某种标准.
我用mikeal/request做了一张票.
我想运行一堆异步任务,并限制在任何给定时间可以完成的任务数量.
假设您有1000个网址,并且您只希望一次打开50个请求; 但只要一个请求完成,您就会打开与列表中下一个URL的连接.这样,一次只打开50个连接,直到URL列表用完为止.
如果可能的话,我也想利用给定数量的线程.
我提出了一种扩展方法,ThrottleTasksAsync
可以实现我想要的功能.那里有更简单的解决方案吗?我认为这是一种常见的情况.
用法:
class Program
{
static void Main(string[] args)
{
Enumerable.Range(1, 10).ThrottleTasksAsync(5, 2, async i => { Console.WriteLine(i); return i; }).Wait();
Console.WriteLine("Press a key to exit...");
Console.ReadKey(true);
}
}
Run Code Online (Sandbox Code Playgroud)
这是代码:
static class IEnumerableExtensions
{
public static async Task<Result_T[]> ThrottleTasksAsync<Enumerable_T, Result_T>(this IEnumerable<Enumerable_T> enumerable, int maxConcurrentTasks, int maxDegreeOfParallelism, Func<Enumerable_T, Task<Result_T>> taskToRun)
{
var blockingQueue = new BlockingCollection<Enumerable_T>(new ConcurrentBag<Enumerable_T>());
var semaphore = new SemaphoreSlim(maxConcurrentTasks);
// Run the throttler on a separate thread.
var t = Task.Run(() => …
Run Code Online (Sandbox Code Playgroud) 我的网站的合法用户偶尔会通过API请求敲击服务器,从而导致不良结果.我想建立一个限制,不过每5秒说一次API调用或每分钟n次调用(还没有弄清楚确切的限制).我显然可以在数据库中记录每个API调用,并对每个请求进行计算以查看它们是否超出限制,但是每个请求的所有额外开销都将失去目的.我可以用什么其他资源不足的方法来制定限制?我正在使用PHP/Apache/Linux,它的价值.
我只是想知道是否有一种优雅的方法来设置特定线程进行密集计算的最大CPU负载.
现在我已经找到了最耗时的线程循环(它只能压缩)和使用GetTickCount()
,并Sleep()
用硬编码值.它确保循环持续一段时间,而不是睡眠一段时间.它或多或少的工作,即保证线程不会使用超过50%的CPU.
然而,行为取决于CPU核心的数量(巨大的劣势)和简单的丑陋(较小的劣势:)).
有任何想法吗?
我正在编写一个运行多个线程的应用程序,并希望限制这些线程的CPU /内存使用量.
对于C++也存在类似的问题,但我想尽可能避免使用C++和JNI.我意识到使用更高级别的语言可能无法做到这一点,但我很想知道是否有人有任何想法.
编辑:增加了赏金; 我想要一些非常好的,深思熟虑的想法.
编辑2:我需要的情况是在我的服务器上执行其他人的代码.基本上它是完全任意的代码,唯一的保证是类文件上会有一个main方法.目前,在运行时加载的多个完全不同的类作为单独的线程并发执行.
它的编写方式,重构为每个执行的类创建单独的进程将是一件痛苦的事.如果这是通过VM参数限制内存使用的唯一好方法,那么就这样吧.但是我想知道是否有办法用线程来做.即使作为一个单独的进程,我也希望能够以某种方式限制其CPU使用率,因为正如我之前提到的,其中一些将立即执行.我不想要一个无限循环来占用所有资源.
编辑3:一种简单的近似对象大小的方法是使用java的Instrumentation类; 特别是getObjectSize方法.请注意,使用此工具需要一些特殊设置.
我正在尝试通过以下方式实现请求限制:
我已将该代码提取到我的解决方案中,并使用以下属性修饰了API控制器端点:
[Route("api/dothis/{id}")]
[AcceptVerbs("POST")]
[Throttle(Name = "TestThrottle", Message = "You must wait {n} seconds before accessing this url again.", Seconds = 5)]
[Authorize]
public HttpResponseMessage DoThis(int id) {...}
Run Code Online (Sandbox Code Playgroud)
这会编译,但属性的代码不会被命中,并且限制不起作用.我没有收到任何错误.我错过了什么?
throttling ×10
c# ×2
cpu ×2
java ×2
linux ×2
.net ×1
apache ×1
asp.net-mvc ×1
async-await ×1
asynchronous ×1
c++ ×1
honeypot ×1
memory ×1
node.js ×1
performance ×1
php ×1
request ×1
security ×1
semaphore ×1
tcp ×1
tpl-dataflow ×1