Nginx带宽控制
有个老项目,通过 Squid 提供文件下载功能,利用 delay_parameters 实现带宽控制,问题是我玩不转 Squid,于是盘算着是不是能在 Nginx 里找到类似的功能。
好消息是 Nginx 提供了 limit_rate 和 limit_rate_after,举个例子来说明一下:
location /download/ {
limit_rate_after 500k;
limit_rate 50k;
}
| /** | |
| * The maximum size of array to allocate. | |
| * Some VMs reserve some header words in an array. | |
| * Attempts to allocate larger arrays may result in | |
| * OutOfMemoryError: Requested array size exceeds VM limit | |
| */ | |
| private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; |
| static Class<?> comparableClassFor(Object x) { | |
| if (x instanceof Comparable) { | |
| Class<?> c; Type[] ts, as; Type t; ParameterizedType p; | |
| if ((c = x.getClass()) == String.class) // bypass checks | |
| return c; | |
| if ((ts = c.getGenericInterfaces()) != null) { | |
| for (int i = 0; i < ts.length; ++i) { | |
| if (((t = ts[i]) instanceof ParameterizedType) && | |
| ((p = (ParameterizedType)t).getRawType() == | |
| Comparable.class) && |
| /** | |
| * Initializes or doubles table size. If null, allocates in | |
| * accord with initial capacity target held in field threshold. | |
| * Otherwise, because we are using power-of-two expansion, the | |
| * elements from each bin must either stay at same index, or move | |
| * with a power of two offset in the new table. | |
| * | |
| * @return the table | |
| */ | |
| final Node<K,V>[] resize() { |
| /** | |
| * Returns a power of two size for the given target capacity. | |
| */ | |
| static final int tableSizeFor(int cap) { | |
| int n = cap - 1; | |
| n |= n >>> 1; | |
| n |= n >>> 2; | |
| n |= n >>> 4; | |
| n |= n >>> 8; | |
| n |= n >>> 16; |
| java.util.IdentityHashMap类利用哈希表实现 Map 接口,比较键(和值)时使用引用相等性代替对象相等性。 | |
| 换句话说,在 IdentityHashMap 中,当且仅当 (k1==k2) 时,才认为两个键 k1 和 k2 相等(在正常 Map 实现(如 HashMap)中, | |
| 当且仅当满足下列条件时才认为两个键 k1 和 k2 相等:(k1==null ? k2==null : e1.equals(e2)))。 | |
| 此类不是 通用 Map 实现!此类实现 Map 接口时,它有意违反 Map 的常规协定, | |
| 该协定在比较对象时强制使用 equals 方法。此类设计仅用于其中需要引用相等性语义的罕见情况。 此类的典型用法是拓扑保留对象图形转换,如序列化或深层复制。 | |
| 要执行这样的转换,程序必须维护用于跟踪所有已处理对象引用的“节点表”。 | |
| 节点表一定不等于不同对象,即使它们偶然相等也如此。此类的另一种典型用法是维护代理对象。 | |
| 例如,调试设施可能希望为正在调试程序中的每个对象维护代理对象。 | |
| 此类提供所有的可选映射操作,并且允许 null 值和 null 键。此类对映射的顺序不提供任何保证;特别是不保证顺序随时间的推移保持不变。 | |
| 此类提供基本操作(get 和 put)的稳定性能,假定系统标识了将桶间元素正确分开的哈希函数 (System.identityHashCode(Object))。 |
| @SuppressWarnings("unchecked") | |
| @Override | |
| public synchronized void forEach(BiConsumer<? super K, ? super V> action) { | |
| Objects.requireNonNull(action); // explicit check required in case | |
| // table is empty. | |
| final int expectedModCount = modCount; | |
| Entry<?, ?>[] tab = table; | |
| for (Entry<?, ?> entry : tab) { | |
| while (entry != null) { |
| @Override | |
| public synchronized V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) { | |
| Objects.requireNonNull(remappingFunction); | |
| Entry<?,?> tab[] = table; | |
| int hash = key.hashCode(); | |
| int index = (hash & 0x7FFFFFFF) % tab.length; | |
| @SuppressWarnings("unchecked") | |
| Entry<K,V> e = (Entry<K,V>)tab[index]; | |
| for (Entry<K,V> prev = null; e != null; prev = e, e = e.next) { |
| private void writeObject(java.io.ObjectOutputStream s) | |
| throws IOException { | |
| int buckets = capacity(); | |
| // Write out the threshold, loadfactor, and any hidden stuff | |
| s.defaultWriteObject(); | |
| s.writeInt(buckets); | |
| s.writeInt(size); | |
| internalWriteEntries(s); | |
| } |
| static final int tableSizeFor(int cap) { | |
| int n = cap - 1; | |
| n |= n >>> 1; | |
| n |= n >>> 2; | |
| n |= n >>> 4; | |
| n |= n >>> 8; | |
| n |= n >>> 16; | |
| return (n < 0) ? 1 : (n >= 1024) ? 1024 : n + 1; | |
| } | |
| 这段方法,其实cap大于1024的时候,返回1024,这显然可以先放在开头的时候判断并直接返回的,不知道,hashmap为何要在最后。 |
Nginx带宽控制
有个老项目,通过 Squid 提供文件下载功能,利用 delay_parameters 实现带宽控制,问题是我玩不转 Squid,于是盘算着是不是能在 Nginx 里找到类似的功能。
好消息是 Nginx 提供了 limit_rate 和 limit_rate_after,举个例子来说明一下:
location /download/ {
limit_rate_after 500k;
limit_rate 50k;
}